home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / 92052tar.gz / 920528.tar / smisc.c < prev    next >
C/C++ Source or Header  |  1992-01-13  |  5KB  |  258 lines

  1. /* @(#) $Header: smisc.c,v 1.7 92/01/12 18:40:35 deyke Exp $ */
  2.  
  3. /* Miscellaneous Internet servers: discard, echo and remote
  4.  * Copyright 1991 Phil Karn, KA9Q
  5.  */
  6. #include <stdio.h>
  7. #include <time.h>
  8. #include "global.h"
  9. #include "mbuf.h"
  10. #include "socket.h"
  11. #include "remote.h"
  12. #include "tcp.h"
  13. #include "udp.h"
  14. #include "commands.h"
  15. #include "hardware.h"
  16.  
  17. char *Rempass = " ";    /* Remote access password */
  18.  
  19. static struct tcb *disc_tcb,*echo_tcb;
  20. static struct udp_cb *remote_up;
  21.  
  22. static void disc_recv __ARGS((struct tcb *tcb, int cnt));
  23. static void echo_recv __ARGS((struct tcb *tcb, int cnt));
  24. static void echo_trans __ARGS((struct tcb *tcb, int cnt));
  25. static void misc_state __ARGS((struct tcb *tcb, int old, int new));
  26. static void uremote __ARGS((struct iface *iface, struct udp_cb *up, int cnt));
  27. static int chkrpass __ARGS((struct mbuf *bp));
  28.  
  29. /* Start up TCP discard server */
  30. dis1(argc,argv,p)
  31. int argc;
  32. char *argv[];
  33. void *p;
  34. {
  35.     struct socket lsocket;
  36.  
  37.     lsocket.address = INADDR_ANY;
  38.     if(argc < 2)
  39.         lsocket.port = IPPORT_DISCARD;
  40.     else
  41.         lsocket.port = tcp_port_number(argv[1]);
  42.     disc_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,disc_recv,NULLVFP,misc_state,0,0);
  43.     return 0;
  44. }
  45. /* Start up TCP echo server */
  46. echo1(argc,argv,p)
  47. int argc;
  48. char *argv[];
  49. void *p;
  50. {
  51.     struct socket lsocket;
  52.  
  53.     lsocket.address = INADDR_ANY;
  54.     if(argc < 2)
  55.         lsocket.port = IPPORT_ECHO;
  56.     else
  57.         lsocket.port = tcp_port_number(argv[1]);
  58.     echo_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,echo_recv,echo_trans,misc_state,0,0);
  59.     return 0;
  60. }
  61.  
  62. /* Start remote exit/reboot server */
  63. rem1(argc,argv,p)
  64. int argc;
  65. char *argv[];
  66. void *p;
  67. {
  68.     struct socket sock;
  69.  
  70.     sock.address = INADDR_ANY;
  71.     if(argc < 2)
  72.         sock.port = IPPORT_REMOTE;
  73.     else
  74.         sock.port = atoi(argv[1]);
  75.     remote_up = open_udp(&sock,uremote);
  76.     return 0;
  77. }
  78.  
  79. /* Shut down miscellaneous servers */
  80. dis0(argc,argv,p)
  81. int argc;
  82. char *argv[];
  83. void *p;
  84. {
  85.     if(disc_tcb != NULLTCB)
  86.         close_tcp(disc_tcb);
  87.     return 0;
  88. }
  89. echo0(argc,argv,p)
  90. int argc;
  91. char *argv[];
  92. void *p;
  93. {
  94.     if(echo_tcb != NULLTCB)
  95.         close_tcp(echo_tcb);
  96.     return 0;
  97. }
  98. rem0(argc,argv,p)
  99. int argc;
  100. char *argv[];
  101. void *p;
  102. {
  103.     if(remote_up){
  104.         del_udp(remote_up);
  105.         remote_up = 0;
  106.     }
  107.     return 0;
  108. }
  109. /* Discard server receiver upcall */
  110. static
  111. void
  112. disc_recv(tcb,cnt)
  113. struct tcb *tcb;
  114. int16 cnt;
  115. {
  116.     struct mbuf *bp;
  117.  
  118.     if(recv_tcp(tcb,&bp,cnt) > 0)
  119.         free_p(bp);                     /* Discard */
  120. }
  121.  
  122. /* Echo server receive
  123.  * Copies only as much will fit on the transmit queue
  124.  */
  125. static
  126. void
  127. echo_recv(tcb,cnt)
  128. struct tcb *tcb;
  129. int cnt;
  130. {
  131.     struct mbuf *bp;
  132.     int acnt;
  133.  
  134.     if(cnt == 0){
  135.         close_tcp(tcb);
  136.         return;
  137.     }
  138.     acnt = min(cnt,tcb->snd.wnd);
  139.     if(acnt > 0){
  140.         /* Get only as much will fit in the send window */
  141.         recv_tcp(tcb,&bp,tcb->snd.wnd);
  142.         send_tcp(tcb,bp);
  143.     }
  144. }
  145. /* Echo server transmit
  146.  * Copies anything that might have been left in the receiver queue
  147.  */
  148. static
  149. void
  150. echo_trans(tcb,cnt)
  151. struct tcb *tcb;
  152. int16 cnt;
  153. {
  154.     struct mbuf *bp;
  155.  
  156.     if(tcb->rcvcnt > 0){
  157.         /* Get only as much will fit in the send window */
  158.         recv_tcp(tcb,&bp,cnt);
  159.         send_tcp(tcb,bp);
  160.     }
  161. }
  162.  
  163. /* Log connection state changes; also respond to remote closes */
  164. static
  165. void
  166. misc_state(tcb,old,new)
  167. register struct tcb *tcb;
  168. char old,new;
  169. {
  170.     switch(new){
  171.     case TCP_ESTABLISHED:
  172.         log(tcb,"open %s",tcp_port_name(tcb->conn.local.port));
  173.         break;
  174.     case TCP_CLOSE_WAIT:
  175.         close_tcp(tcb);
  176.         break;
  177.     case TCP_CLOSED:
  178.         log(tcb,"close %s",tcp_port_name(tcb->conn.local.port));
  179.         del_tcp(tcb);
  180.         /* Clean up if server is being shut down */
  181.         if(tcb == disc_tcb)
  182.             disc_tcb = NULLTCB;
  183.         else if(tcb == echo_tcb)
  184.             echo_tcb = NULLTCB;
  185.         break;
  186.     }
  187. }
  188. /* Process remote exit/reset command */
  189. static void
  190. uremote(iface,up,cnt)
  191. struct iface *iface;
  192. struct udp_cb *up;
  193. int cnt;
  194. {
  195.  
  196.     struct mbuf *bp;
  197.     struct socket fsock;
  198.     int i;
  199.     char command;
  200.     int32 addr;
  201.  
  202.     recv_udp(up,&fsock,&bp);
  203.     command = PULLCHAR(&bp);
  204.     switch(uchar(command)){
  205. #ifdef  MSDOS   /* Only present on PCs running MSDOS */
  206.     case SYS_RESET:
  207.         i = chkrpass(bp);
  208.         log(Rem,"%s - Remote reset %s",
  209.          pinet_udp((struct sockaddr *)&fsock),
  210.          i == 0 ? "PASSWORD FAIL" : "" );
  211.         if(i != 0){
  212.             iostop();
  213.             sysreset();     /* No return */
  214.         }
  215.         break;
  216. #endif
  217.     case SYS_EXIT:
  218.         i = chkrpass(bp);
  219.         log(NULLTCB,"%s - Remote exit %s",
  220.          pinet_udp(&fsock),
  221.          i == 0 ? "PASSWORD FAIL" : "" );
  222.         if(i != 0){
  223.             iostop();
  224.             exit(0);
  225.         }
  226.         break;
  227.     case KICK_ME:
  228.         if(len_p(bp) >= sizeof(int32))
  229.             addr = pull32(&bp);
  230.         else
  231.             addr = fsock.address;
  232.         kick(addr);
  233.         /*** smtptick((void *)addr); ***/
  234.         break;
  235.     }
  236.     free_p(bp);
  237. }
  238. /* Check remote password */
  239. static int
  240. chkrpass(bp)
  241. struct mbuf *bp;
  242. {
  243.     char *lbuf;
  244.     int16 len;
  245.     int rval = 0;
  246.  
  247.     len = len_p(bp);
  248.     if(strlen(Rempass) != len)
  249.         return rval;
  250.     lbuf = mallocw(len);
  251.     pullup(&bp,lbuf,len);
  252.     if(strncmp(Rempass,lbuf,len) == 0)
  253.         rval = 1;
  254.     free(lbuf);
  255.     return rval;
  256. }
  257.  
  258.